import axios from 'axios'

/**
 * 默认请求参数
 */
const _defaults = {

  // 构件编码（必须）
  componentCode: undefined,
  // 活动集编码（必须）
  rulesetCode: undefined,

  // webapi编码
  // 传入`apiCode`时, `componentCode`, `rulesetCode`失效
  apiCode: undefined,

  // url参数
  // 这里的参数会拼接在url后面, 会有url超长风险
  params: {},

  // body参数
  // 适用：`put`, `post`, `patch`
  data: {},

  // 请求方式
  method: 'post',

  // 响应类型
  // 选项：`arraybuffer`, `blob`, `document`, `json`, `text`, `stream`
  responseType: 'json'
}

/**
 * 添加响应拦截器
 */
axios.interceptors.response.use(function(response) {
  if (response.config.url.includes('/webapi/')) {

    // 临时处理IE9的Bug：https://github.com/axios/axios/issues/265
    if (response.data === undefined || response.data == null) {
      response.data = JSON.parse(response.request.responseText)
    }

    if (response.data.error === true || response.data.error === false) {
      if (response.data.exceptionType === "BusinessException") {
        response.data.data = {
          success: false,
          message: response.data.msg
        }
        return response.data.data
      }
    } else {
      return response.data.data
    }
    return response
  }
}, function(error) {
  // TODO 处理失败请求
  return Promise.reject(error);
});

/**
 * 封装请求参数
 */
const _wrap = (config) => {
  if (config.apiCode) {
    config.componentCode = config.apiCode.split('.')[0];
    config.rulesetCode = config.apiCode.split('.')[1];
  }
  config.url = `webapi/${config.componentCode}/${config.rulesetCode}`;
  return Object.assign({}, _defaults, config);
}

/**
 * 发起单个服务请求
 *
 * vs.request({...}).then(data => {
 *  ...
 * })
 */
const request = (config) => {
  return axios(_wrap(config));
}

/**
 * 发起多个服务请求
 *
 * let requestA = vs.request({...});
 * let requestB = vs.request({...});
 * vs.batchRequest([requestA, requestB]).then(data => {
 *  let dataA = data[0];
 *  let dataB = data[1];
 * });
 */
const batchRequest = (requests) => {
  return Promise.all(requests);
}

/**
 * 扩展参数
 *
 * let requestA = vs.request({...});
 * let requestB = vs.request({...});
 * vs.batchRequest([requestA, requestB]).then(vs.spread((dataA, dataB) => {
 *  // 直接使用dataA, dataB
 * }));
 */
const spread = (callback) => (spreadData) => callback.apply(null, spreadData);

export default {
  spread,
  request,
  batchRequest
}
